package com.testing.mysql;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;

/**
 * @Classname MysqlUtils
 * @Description 类型说明
 * @Date 2021/9/9 22:14
 * @Created by 特斯汀Roy
 */
public class MysqlUtils {

    //成员变量 mysql的连接对象
    private static Connection royConn;

    /**
     * 基于properties文件创建mysql的连接
     */
    public static void createCon() {
        try {
            //加载properties文件中的参数设置，以及创建mysql连接，实例化成员变量
            InputStream resourceAsStream = MysqlUtils.class.getResourceAsStream("/mysql.properties");
            Properties mysql = new Properties();
            mysql.load(resourceAsStream);
            String mysqlurl = mysql.getProperty("mysqlurl");
            String mysqluser = mysql.getProperty("mysqluser");
            String mysqlpwd = mysql.getProperty("mysqlpwd");
            Class.forName("com.mysql.jdbc.Driver");
            royConn = DriverManager.getConnection(mysqlurl, mysqluser, mysqlpwd);
        } catch (Exception e) {
            System.out.println("创建mysql连接失败");
        }
    }

    /**
     * 编写方法，用于基于用户名和密码查询数据库，判断登录是否成功。
     * 如果能够查到数据，登录就是成功的
     *
     * @return
     */
    public static boolean checkLogin(String user, String password) {
        try {
            createCon();
            Statement chaxun = royConn.createStatement();
            ResultSet resultSet = chaxun.executeQuery("select * from userinfo where username='" + user + "' and password='" + password + "';");
            //只要能够查到结果，登录就是成功的
            if (resultSet != null && resultSet.next()) {
                return true;
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }


    /**
     * 通过存储过程进行登录验证。
     * @param user
     * @param password
     * @return
     */
    public static boolean proCheckLogin(String user, String password) {
        try {
            createCon();
            //调用存储过程,使用?来代表存储过程中的参数
            CallableStatement callableStatement = royConn.prepareCall("call login(?,?)");
            //设置存储过程使用的参数
            callableStatement.setString("user", user);
            callableStatement.setString(2, password);
            ResultSet resultSet = callableStatement.executeQuery();
            if (resultSet != null && resultSet.next()) {
                resultSet.close();
                royConn.close();
                return true;
            } else {
                royConn.close();
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("执行查询存储过程中出错了。");
            return false;
        }
    }


    /**
     * 方法用于查询sql语句并且将所有结果存储为 list《map》格式
     * @param sql  需要查询的sql语句
     * @return  所有的结果
     */
    public static List<Map<String,String>> queryAll(String sql){
        try {
            createCon();
            Statement chaxun = royConn.createStatement();
            System.out.println(sql);
            ResultSet resultSet = chaxun.executeQuery(sql);
            ResultSetMetaData headerInfo = resultSet.getMetaData();
            int count = headerInfo.getColumnCount();
            List<Map<String, String>> resultList = new ArrayList<>();
            while (resultSet != null && resultSet.next()) {
                //每一行存一个map
                Map<String, String> lineMap = new HashMap<>();
                for (int i = 1; i <= count; i++) {
                    System.out.println(headerInfo.getColumnName(i) + "的值是" + resultSet.getString(i));
                    lineMap.put(headerInfo.getColumnName(i), resultSet.getString(i));
                }
                resultList.add(lineMap);
            }
            System.out.println(resultList);
            return resultList;
        } catch (Exception throwables) {
            throwables.printStackTrace();
            System.out.println("查询过程中出现问题，请检查sql语句以及其他状态。");
            return new ArrayList<>();
        }
    }



}
